﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once

#include "IUnCommandControlDefinition.h"

namespace gcmp
{

enum class CheckState;
class IControlState;
class ICheckBoxGroupEvent;
class ICheckBoxGroupHandler;

/// \brief CheckBox控件数据定义接口
class ICheckBoxDefinition : public IUnCommandControlDefinition
{
public:
    /// \brief 得到CheckBox的check状态
    virtual CheckState GetCheckState() const = 0;
};

/// \brief CheckBoxGroup数据定义接口
class GCMP_GUI_BASE_INTERFACE_EXPORT ICheckBoxGroupDefinition : public IUnCommandControlDefinition
{
public:
    /// \brief 创建ICheckBoxGroupDefinition对象
    ///
    /// \param id    CheckBoxGroup控制数据定义的Id
    /// \param caption    CheckBoxGroup控件标题
    /// \return  CheckBoxGroup控制数据定义对象。失败时返回空
    static OwnerPtr<ICheckBoxGroupDefinition> Create(const std::wstring& id, const std::wstring& caption);

    /// \brief 创建pCheckBoxGroupDefinition的引用
    ///
    /// pCheckBoxGroupDefinition需加到IControlDefinitionLibrary时才能创建引用对象；不能通过引用创建引用 
    /// \param pCheckBoxGroupDefinition   ICheckBoxGroupDefinition对象
    /// \return  创建出ICheckBoxGroupDefinition对象。失败时返回空
    static OwnerPtr<ICheckBoxGroupDefinition> CreateReference(const ICheckBoxGroupDefinition* pCheckBoxGroupDefinition);

    /// \brief 添加CheckBox至最后
    /// 
    /// \param id    CheckBox的id,在该CheckBoxGroup需保证唯一性
    /// \param caption    控件标题
    /// \param tooltip    控件的提示信息
    /// \param checkState  CheckBox的check状态
    /// \return   true表示成功，如果CheckBoxGroup已有Id为id的CheckBox,则返回false
    virtual bool AddCheckBox(const std::wstring& id, const std::wstring& caption, const std::wstring& tooltip, CheckState checkState) = 0;

    /// \brief 插入CheckBox
    ///
    /// 插入checkBox至id为beforeId的前面
    /// \param beforeId   被插入对象的Id
    /// \param id         将插入CheckBox的id,在该CheckBoxGroup需保证唯一性
    /// \param caption    将插入的控件标题
    /// \param tooltip    将插入的控件的提示信息
    /// \param checkState  将插入的CheckBox的check状态
    /// \return     true表示成功， 如果CheckBoxGroup不包含Id为beforeId及包含Id为id的CheckBox,则返回false；
    virtual bool InsertCheckBox(const std::wstring& beforeId, const std::wstring& id, const std::wstring& caption, const std::wstring& tooltip, CheckState checkState) = 0;

    /// \brief 删除CheckBox
    ///
    /// \param id    将删除对象的Id
    /// \return  true表示成功，如果CheckBoxGroup不包含Id为id的CheckBox,则返回false
    virtual bool DeleteCheckBox(const std::wstring& id) = 0;

    /// \brief 删除所有CheckBox
    virtual void DeleteAllCheckBoxes() = 0;

    /// \brief 得到所有的CheckBox
    ///
    /// \return  CheckBox集合
    virtual std::vector<const ICheckBoxDefinition*> GetAllCheckBoxes() const = 0;

    /// \brief 得到CheckBox的状态
    ///
    /// \param id   将得到CheckBox的状态的Id
    /// \param pOk    bool指针对象，如果CheckBoxGroup不包含Id为id的CheckBox,pOk将为false
    /// \return     CheckBox的选中状态
    virtual CheckState GetCheckState(const std::wstring& id, bool* pOk) const = 0;

    /// \brief 设置CheckBox的Check状态
    ///
    /// \param id   将设置CheckBox的状态的Id
    /// \param checkState CheckBox的状态
    /// \return     true表示成功， 如果CheckBoxGroup不包含Id为id的CheckBox,则返回false
    virtual bool SetCheckState(const std::wstring& id, CheckState checkState) = 0;

    /// \brief 设置CheckBox的可见及可用状态以及执行函数
    ///
    /// \param pControlHandler CheckBoxGroup控件处理者
    /// \return     true表示成功，false表示失败
    virtual bool SetControlHandler(OwnerPtr<ICheckBoxGroupHandler> pControlHandler) = 0;


    /////////////////////////////////////////////////////////////////////////////////////
    /// \brief 设置CheckBox的可用性（相关代码会调整，请勿使用）
    ///
    /// 通过SetControlState设置后，SetEnabled将不起作用
    /// \param id   将设置CheckBox的状态的Id
    /// \param enabled true代表设置可用，false代表设置不可用
    /// \return     true表示成功， 如果CheckBoxGroup不包含Id为id的CheckBox,则返回false
    virtual bool SetEnabled(const std::wstring& id, bool enabled) = 0;

    /// \brief 设置CheckBox的可见性 （相关代码会调整，请勿使用）
    ///
    /// 通过SetControlState设置后，SetVisible将不起作用
    /// \param id   将设置CheckBox的状态的Id
    /// \param visible true代表设置可见，false代表设置不可见
    /// \return     true表示成功， 如果CheckBoxGroup不包含Id为id的CheckBox,则返回false
    virtual bool SetVisible(const std::wstring& id, bool visible) = 0;

    /// \brief 得到ICheckBoxGroupEvent对象（相关代码会调整，请勿使用）
    ///
    /// \return  ICheckBoxGroupEvent对象
    virtual ICheckBoxGroupEvent* GetEvent() const = 0;
};

}   // end namespace gcmp
